// 课程成绩统计（默认参数、命名参数、可变参数示例）
object FunctionParametersDemo extends App {
  // 1. 默认参数：统计及格率（默认及格线60分）
  def calculatePassRate(scores: List[Int], passLine: Int = 60): Double = {
    if (scores.isEmpty) 0.0
    else {
      val passCount = scores.count(_ >= passLine)
      passCount.toDouble / scores.size * 100 // 转换为百分比
    }
  }

  // 2. 命名参数：生成成绩报告（参数较多时提高可读性）
  def generateScoreReport(
                           className: String,
                           subject: String,
                           totalStudents: Int,
                           averageScore: Double,
                           passRate: Double
                         ): String = {
    s"""|=====成绩报告=====
        |班级: $className
        |科目: $subject
        |学生总数: $totalStudents
        |平均分: $averageScore
        |及格率: $passRate%
        |=================="""".stripMargin
  }

  // 3. 可变参数：计算总分（接收任意数量的成绩）
  def calculateTotalScore(scores: Int*): Int = {
    scores.sum // 可变参数在函数内视为Seq
  }

  // 4. 混合参数：成绩综合分析（默认参数+可变参数）
  def analyzeScores(
                     className: String,
                     subject: String,
                     passLine: Int = 60,
                     scores: Int*
                   ): Unit = {
    if (scores.isEmpty) {
      println(s"$className 的 $subject 没有成绩数据")
      return
    }
    // 传递可变参数给其他函数时需用 _* 转换
    val total = calculateTotalScore(scores: _*)
    val average = total.toDouble / scores.size
    val passRate = calculatePassRate(scores.toList, passLine)

    // 调用生成报告函数（使用命名参数）
    val report = generateScoreReport(
      className = className,
      subject = subject,
      totalStudents = scores.size,
      averageScore = average,
      passRate = passRate
    )
    println(report)
  }

  // 测试函数调用
  val class1MathScores = List(85, 92, 58, 76, 88, 90, 65, 72, 45, 80)

  // 使用默认参数（不指定及格线，默认60分）
  val defaultPassRate = calculatePassRate(class1MathScores)
  println(s"默认及格线(60分)的及格率: $defaultPassRate%") // 输出：默认及格线(60分)的及格率: 70.0%

  // 覆盖默认参数（指定及格线70分）
  val strictPassRate = calculatePassRate(class1MathScores, 70)
  println(s"严格及格线(70分)的及格率: $strictPassRate%") // 输出：严格及格线(70分)的及格率: 60.0%

  // 使用可变参数（计算4名学生总分）
  val total = calculateTotalScore(85, 92, 76, 88)
  println(s"4名学生的总分: $total") // 输出：4名学生的总分: 341

  // 混合使用参数（生成成绩报告）
  println("\n生成成绩报告:")
  analyzeScores(
    className = "高一(1)班",
    subject = "数学",
    scores = 85, 92, 58, 76, 88, 90, 65, 72, 45, 80
  )
}
